package com.axujie.tlgypt.service.session;
/**
 * 统一管理接口Session
 * @author XuJie
 * @date 2017年11月4日
 */

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.axujie.tlgypt.service.entity.UserInfo;
import com.axujie.tlgypt.service.utils.DBUtil;
import com.axujie.tlgypt.service.utils.TreeHelper;


public class TyglptSession {
	private static final Map<Integer, String> loginMap;
	static {
		loginMap = new HashMap<Integer,String>();
		loginMap.put(0, "验证通过！");
		loginMap.put(1, "用户不存在！");
		loginMap.put(2, "用户名或密码错误！");
		loginMap.put(3, "您的账号已被冻结，请联系管理员解除冻结！");
		loginMap.put(4, "您无权使用此系统，请联系管理员授权！");
	}

	public static void main(String[] args) {
		TyglptSession tyglptSession = new TyglptSession();
		String result =tyglptSession.login("SuperAdmin", "123", "TYGLPT", "CC", "ss");
		System.out.println(result);
		JSONObject jsonObject = JSON.parseObject(result);
		UserInfo userInfo = JSON.parseObject(jsonObject.getString("data"), UserInfo.class);
		System.out.println(userInfo.getHhid());
		result = tyglptSession.getAllMenu(userInfo.getHhid(), "SuperAdmin", "", "TYGLPT", "");
		System.out.println(result);
	}
	
	/**
	 * 用户登录
	 * @param yhid 用户账号
	 * @param dlkl 登录口令
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @param ip IP地址
	 * @return
	 */
	public String login(String yhid, String dlkl, String ywxtbm, String ywxtmc,String ip) {
		String result = "";
		Connection connection = null;
		CallableStatement callableStatement = null;
		try {
			connection = DBUtil.getConnection();
			callableStatement = connection.prepareCall("{ ? =call CHECKLOGIN( ?, ?, ?, ?,?,?)}");
			callableStatement.setString(2, yhid);
			callableStatement.setString(3, dlkl);
			callableStatement.setString(4, ywxtbm);
			callableStatement.setString(5, ywxtmc);
			callableStatement.setString(6, ip);
			String hhid = _createHhid();
			callableStatement.setString(7, hhid);
			callableStatement.registerOutParameter(1, Types.INTEGER);
			callableStatement.execute();
			int code = callableStatement.getInt(1);
			if(code==0) {//验证成功，查询用户基本信息
				Map<String, Object> data = _getUserInfo(yhid);
				if(data!=null) {
					data.put("hhid", hhid);
				}
				result = _return(true, loginMap.get(code), data);
			}else {//验证失败
				result = _return(false, loginMap.get(code), null);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.closeResource(null, callableStatement, connection);
		}
		return result;
	}

	/**
	 * HHID验证用户
	 * @param hhid 会话ID
	 * @param yhid 用户账号
	 * @param ip IP地址
	 * @return
	 */
	public String checkLogin(String hhid, String yhid, String ip) {
		boolean authen = _authenHhid(hhid);
		String msg = authen?"验证成功":"HHID已经失效，请重新登录！";
		return _return(authen, msg, null);
	}

	/**
	 *  获取系统菜单权限
	 * @param hhid HHID
	 * @param yhid 用户账号
	 * @param ip IP
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @return
	 */
	public String getAllMenu(String hhid, String yhid, String ip, String ywxtbm, String ywxtmc) {
		String result = "";
		if(_authenHhid(hhid)) {
			Connection connection = null;
			CallableStatement callableStatement = null;
			try {
				connection = DBUtil.getConnection();
				callableStatement = connection.prepareCall("{ call PRE_YHGNQX( ?, ?,?)}");
				callableStatement.setString(1, yhid);
				callableStatement.setString(2, ywxtbm);
				callableStatement.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);//oracle游标返回值
				callableStatement.execute();
				ResultSet resultSet = (ResultSet)callableStatement.getObject(3);
				List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
				while(resultSet.next()) {
					Map<String, Object> map = new HashMap<String,Object>();
					map.put("gnbm", resultSet.getString("GNBM"));
					map.put("gnmc", resultSet.getString("GNMC"));
					map.put("bcbm", resultSet.getString("BCBM"));
					map.put("xssx", resultSet.getInt("XSSX"));
					map.put("iconCls", resultSet.getString("ICONCLS"));
					map.put("sjcd", resultSet.getString("SJCD"));
					map.put("cj", resultSet.getInt("CJ"));
					map.put("url", resultSet.getString("GNDZ"));
					map.put("sjcdmc", resultSet.getString("SJCDMC"));
					map.put("id", resultSet.getString("GNBM").replace(".", "_"));
					map.put("text", resultSet.getString("GNMC"));
					list.add(map);
				}
				result = _return(true, "获取菜单成功", TreeHelper.buildTree(list, "sjcd", "gnbm"));
			} catch (Exception e) {
				e.printStackTrace();
				result = _return(false, e.getMessage(), null);
			}finally {
				DBUtil.closeResource(null, callableStatement, connection);
			}
		}else {
			result = _return(false, "HHID已失效，请重新登录", null);
		}
		return result;
	}

	/**
	 * 获取所有单位信息
	 * @param hhid HHID
	 * @param yhid 用户账号
	 * @param ip IP
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @return
	 */
	public String allDepart(String hhid, String yhid, String ip, String ywxtbm, String ywxtmc) {
		// TODO Auto-generated method stub
		return null;
	}

	/**
	 * 通过条件获取单位信息
	 * @param hhid HHID
	 * @param yhid 用户账号
	 * @param ip IP
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @param where Where条件
	 * @return
	 */
	public String departByWhere(String hhid, String yhid, String ip,String ywxtbm, String ywxtmc, String where) {
		// TODO Auto-generated method stub
		return null;
	}

	/**
	 * 通过单位编码获取岗位
	 * @param hhid HHID
	 * @param yhid 用户账号
	 * @param ip IP
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @param dwbm 单位编码
	 * @return
	 */
	public String getGwByDepart(String hhid, String yhid, String ip, String ywxtbm, String ywxtmc, String dwbm) {
		// TODO Auto-generated method stub
		return null;
	}

	/**
	 * 通过单位编码获取用户
	 * @param hhid HHID
	 * @param yhid 用户账号
	 * @param ip IP
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @param dwbm 单位编码
	 * @return
	 */
	public String getUserByDepart(String hhid, String yhid, String ip,String ywxtbm, String ywxtmc, String dwbm) {
		// TODO Auto-generated method stub
		return null;
	}

	/**
	 * 通过岗位获取用户
	 * @param hhid HHID
	 * @param yhid 用户账号
	 * @param ip IP
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @param gwbm 岗位编码
	 * @return
	 */
	public String getUserByGw(String hhid, String yhid, String ip, String ywxtbm, String ywxtmc, String gwbm) {
		// TODO Auto-generated method stub
		return null;
	}
	
	/**
	 * 通过HHID获取用户信息
	 * @param hhid HHID
	 * @param yhid 用户账号
	 * @param ip IP
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @return
	 */
	public String getUserByHhid(String hhid, String yhid, String ip, String ywxtbm, String ywxtmc) {
		// TODO Auto-generated method stub
		return null;
	}

	/**
	 * 通过条件获取用户信息
	 * @param hhid HHID
	 * @param yhid 用户账号
	 * @param ip IP
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @param where Where条件
	 * @return
	 */
	public String getUsersByWhere(String hhid, String yhid, String ip, String ywxtbm, String ywxtmc, String where) {
		// TODO Auto-generated method stub
		return null;
	}

	/**
	 * 通过HHID获取授权信息
	 * @param hhid HHID
	 * @param yhid 用户账号
	 * @param ip IP
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @return
	 */
	public String getSjsqByHhid(String hhid, String yhid,  String ip,String ywxtbm, String ywxtmc) {
		// TODO Auto-generated method stub
		return null;
	}

	/**
	 * 通过SQL查询数据
	 * @param hhid HHID
	 * @param yhid 用户账号
	 * @param ip IP
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @param SQL SQL
	 * @return
	 */
	public String getDataBySql(String hhid, String yhid, String ip,String ywxtbm, String ywxtmc, String sql) {
		// TODO Auto-generated method stub
		return null;
	}

	/**
	 * 发送消息
	 * @param msg 消息内容
	 * @param phones 接收号码
	 * @param hhid HHID
	 * @param yhid 用户账号
	 * @param ip IP
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @return
	 */
	public String sendMsg(String msg, String[] phones, String hhid, String yhid, String ip, String ywxtbm,
			String ywxtmc) {
		// TODO Auto-generated method stub
		return null;
	}

	/**
	 * 加密用户密码
	 * @param enyhid 用户账号
	 * @param enPass 用户密码
	 * @param hhid HHID
	 * @param yhid 用户账号
	 * @param ip IP
	 * @param ywxtbm 业务系统编码
	 * @param ywxtmc 业务系统名称
	 * @return
	 */
	public String enUserPass(String enyhid, String enPass, String hhid, String yhid, String ip, String ywxtbm,
			String ywxtmc) {
		if(_authenHhid(hhid)) {
			return _return(true, "加密成功", _enUserKey(enyhid, enPass));
		}else {
			return _return(false, "HHID失效,请重新登录", _enUserKey(enyhid, enPass));
		}
		
	}
	
	/**
	 * 输出结果
	 * @param result
	 * @param msg
	 * @param data
	 * @return
	 */
	private static String _return(boolean result,String msg,Object data) {
		Map<String, Object> map = new HashMap<String,Object>();
		map.put("result", result);
		map.put("msg", msg);
		map.put("data", JSON.toJSONString(data));
		return JSON.toJSONString(map);
	}

	/**
	 * 加密用户账号
	 * @param yhid
	 * @param dlkl
	 * @return
	 */
	private static String _enUserKey(String yhid,String dlkl) {
		//TODO
		return dlkl;
	}

	/**
	 * 验证HHID是否有效
	 * @param yhid
	 * @param ywxtbm
	 * @param hhid
	 * @return
	 */
	private static boolean _authenHhid(String hhid) {
		String sql = "select count(hhid) from TYGLPT_COMMON_B_HHGL t where t.hhid = ? and dqzt = '1'";
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		boolean authen = false;
		try {
			connection = DBUtil.getConnection();
			preparedStatement = connection.prepareStatement(sql);
			preparedStatement.setString(1, hhid);
			resultSet = preparedStatement.executeQuery();
			if(resultSet!=null) {
				resultSet.next();
				authen = resultSet.getInt(1)>0?true:false;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.closeResource(resultSet, preparedStatement, connection);
		}
		return authen;
	}
	
	private Map<String, Object> _getUserInfo(String yhid){
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		Map<String, Object> map = null;
		try {
			connection = DBUtil.getConnection();
			String sql = "select t.yhid,t.yhxm,t.yhxb,t.csrq,t.yhdh,t.yhsj,t.email,t.dwbm,(select dwmc from TYGLPT_COMMON_B_DWJBXX dw where dw.dwbm = t.dwbm) as dwmc,t.gwbm,(select gwmc from TYGLPT_COMMON_B_GWJBXX gw where gw.gwbm =t.gwbm ) as gwmc from TYGLPT_COMMON_B_YHJBXX t where t.yhid = ?";
			preparedStatement = connection.prepareStatement(sql);
			preparedStatement.setString(1, yhid);
			resultSet = preparedStatement.executeQuery();
			if(resultSet!=null) {
				resultSet.next();
				map = new HashMap<String,Object>();
				map.put("yhid", resultSet.getString("YHID"));
				map.put("yhxm", resultSet.getString("YHXM"));
				map.put("yhxb", resultSet.getString("YHXB"));
				map.put("csrq", resultSet.getTimestamp("CSRQ"));
				map.put("yhdh", resultSet.getString("YHDH"));
				map.put("yhsj", resultSet.getString("yhsj"));
				map.put("email", resultSet.getString("email"));
				map.put("dwbm", resultSet.getString("dwbm"));
				map.put("dwmc", resultSet.getString("dwmc"));
				map.put("gwbm", resultSet.getString("gwbm"));
				map.put("gwmc", resultSet.getString("gwmc"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.closeResource(resultSet, preparedStatement, connection);
		}
		return map;
	}
	
	/**
	 * 创建HHID
	 * @return
	 */
	private static String _createHhid() {
		return UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
	}
	
	
}
